import os
import json
import requests
from types import SimpleNamespace

# ==============================================================================
#  手动实现的 DeepSeekClient
#  注意：这是一个用于替代官方库的简化版本。
# ==============================================================================
class DeepSeekClient:
    def __init__(self, api_key=None):
        """
        初始化客户端。
        :param api_key: 您的 DeepSeek API Key。如果为 None，会尝试从环境变量读取。
        """
        self.api_key = api_key or os.getenv("DEEPSEEK_API_KEY")
        if not self.api_key:
            raise ValueError("API key must be provided or set in DEEPSEEK_API_KEY environment variable.")
        
        # 为了模拟官方库的 `client.chat.completions.create` 结构
        self.chat = self._Chat(self.api_key)

    class _Chat:
        def __init__(self, api_key):
            self.completions = self._Completions(api_key)

    class _Completions:
        BASE_URL = "https://api.deepseek.com/v1"

        def __init__(self, api_key):
            self.api_key = api_key
            self._session = requests.Session()
            self._session.headers.update({
                "Authorization": f"Bearer {self.api_key}",
                "Content-Type": "application/json",
            })

        def create(self, model, messages, **kwargs):
            """
            创建聊天补全请求。
            """
            endpoint = "/chat/completions"
            url = self.BASE_URL + endpoint

            payload = {
                "model": model,
                "messages": messages,
                **kwargs
            }

            try:
                response = self._session.post(url, json=payload, timeout=60)
                response.raise_for_status()  # 如果状态码是 4xx 或 5xx，则抛出异常

                # 将返回的 JSON 转换为嵌套的对象，以模拟官方库的 `response.choices[0].message.content` 访问方式
                response_obj = json.loads(
                    response.text,
                    object_hook=lambda d: SimpleNamespace(**d)
                )
                return response_obj

            except requests.exceptions.RequestException as e:
                print(f"API 请求失败: {e}")
                # 返回一个符合结构的错误对象
                error_choice = SimpleNamespace(message=SimpleNamespace(content=f"API 请求失败: {e}"))
                return SimpleNamespace(choices=[error_choice])


# ==============================================================================
#  调用客户端的函数 (这部分代码与之前保持一致)
# ==============================================================================
def get_book_summary(book_title, author):
    """
    调用 DeepSeek API 为指定书籍生成摘要。
    """
    try:
        # 现在这里会使用我们上面定义的 DeepSeekClient 类
        client = DeepSeekClient() 
        
        prompt = f"""
        请你扮演一位知识渊博的图书评论家，为我生成一本名为《{book_title}》（作者：{author}）的详细摘要。
        摘要应大约300字，并包含以下几个方面：
        1. 主要情节或核心论点。
        2. 这本书想要传达的核心思想或主题。
        3. 读者能从中获得的启发或思考。
        请以流畅、吸引人的方式进行叙述。
        """

        response = client.chat.completions.create(
            model="deepseek-chat",
            messages=[
                {"role": "system", "content": "你是一位专业的图书评论家。"},
                {"role": "user", "content": prompt},
            ],
            max_tokens=500,
            temperature=0.7,
        )
        
        return response.choices[0].message.content

    except Exception as e:
        print(f"生成 AI 摘要时发生错误: {e}")
        return "抱歉，AI 摘要生成失败，请稍后再试。"
